package boot.example.tcp.server.netty.config;


import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageCodec;
import lombok.extern.slf4j.Slf4j;

import java.util.List;


/**
 * 完成POJO到ByteBuf数据包的编解码器。基类为ByteToMessageCodec，它是一个抽象类。从功能上说，继承 ByteToMessageCodec就等同于继承了ByteToMessageDecoder和 MessageToByteEncoder这两个基类。
 *
 * 编解码器ByteToMessageCodec同时包含了编码encode()和解码decode()两个抽象方法，完成了编码器和解码器的结合，这两个方法都需要子类实现。在使用时，加入流水线时也只需要加入 一次。
 *
 */
@Slf4j
public class IntegerEncodeAndDecode extends ByteToMessageCodec<Integer> {

    @Override
    protected void encode(ChannelHandlerContext ctx, Integer msg, ByteBuf out) throws Exception {
        out.writeInt(msg);
        log.info("IntegerEncode：{}",msg);
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // int 占用4个字节
        while (in.readableBytes() >= 4) {
            int i = in.readInt();
            log.info("解码出一个整数: " + i);
            out.add(i);
        }
    }
}
